import os
import requests  # 网络请求模块
from lxml import etree  # 数据解析模块
import pandas as pd  # 数据分析模块快
from matplotlib import pyplot as plt #绘图模块

# 设置matplotlib以支持中文显示和负号
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# 定义Excel和CSV文件名
excelFileName = "豆瓣电影top250数据.xlsx"
csvFileName = "豆瓣电影top250数据.csv"

# 定义请求头信息
headers = {
    'User-Agent':
        'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36 Edg/108.0.1462.46'
}

# 功能函数，获取列表的第一个元素并去除两端空格
def get_first_text(list):
    try:
        return list[0].strip()
    except:
        return ""

# 检查文件是否存在，避免重复爬取
def check() -> bool:
    if os.path.exists(csvFileName) and os.path.exists(excelFileName):
        return True
    else:
        print("已经存在文件:", excelFileName, "无需重复爬取")
        return False

# 获取豆瓣电影Top250数据
def getMovieData():
    df = pd.DataFrame(columns=["序号", "电影名称", "导演、主演","上映时间、电影类型", "电影评分", "评价人数", "简介", "链接"])
    # 生成10个页面的URL
    urls = ['https://movie.douban.com/top250?start={}&filter='.format(str(i * 25)) for i in range(10)]
    count = 1   # 序号计数器
    for url in urls:
        res = requests.get(url=url, headers=headers)
        html = etree.HTML(res.text)
        # 获取所有电影的li元素
        lis = html.xpath('//*[@id="content"]/div/div[1]/ol/li')
        for li in lis:
            title = get_first_text(li.xpath('./div/div[2]/div[1]/a/span[1]/text()'))  # 电影名称
            dictor = get_first_text(li.xpath('./div/div[2]/div[2]/p[1]/text()[1]'))  # 导演、主演
            type = get_first_text(li.xpath('./div/div[2]/div[2]/p[1]/text()[2]'))  # 上映时间、电影类型
            score = get_first_text(li.xpath('./div/div[2]/div[2]/div/span[2]/text()'))  # 评分
            comment = get_first_text(li.xpath('./div/div[2]/div[2]/div/span[4]/text()'))  # 评价人数
            summary = get_first_text(li.xpath('./div/div[2]/div[2]/p[2]/span/text()'))  # 电影简介
            src = get_first_text(li.xpath('./div/div[2]/div[1]/a/@href'))  # 电影链接
            print(count, title, src, dictor, score, comment, summary,type)  # 输出
            df.loc[len(df.index)] = [count, title, dictor,type, score, comment, summary, src]
            count += 1
    df.to_excel(excelFileName, sheet_name="豆瓣电影top250数据", na_rep="")
    df.to_csv(csvFileName, index=False)
    print("文件已经生成！")

def main():
    if not check():
        getMovieData()

if __name__ == '__main__':
    main()